`
https://leetcode.cn/problems/sliding-subarray-beauty/
`

/**
 * @param {number[]} nums
 * @param {number} k
 * @param {number} x
 * @return {number[]}
 */
var getSubarrayBeauty = function (nums, k, x) {
  const n = nums.length

  const { get, set, getMin } = (() => {
    const cnt = new Array(101).fill(0)
    return {
      get(num) {
        return cnt[num + 50]
      },
      set(num, count) {
        cnt[num + 50] = count
      },
      getMin(x) {
        // 题目值域较小，直接遍历求第 x 小即可
        // <= num 的数有 >= x 个，就说明 num 是第 x 小的数
        let count = 0
        for (let i = 0; i < 101; i++) {
          count += cnt[i]
          if (count >= x) return i - 50
        }
      }
    }
  })()

  const res = new Array(n - k + 1).fill(0)
  let left = 0, right = 0

  // 维护一个长度为 k 的滑动窗口
  while (right < n) {
    const n1 = nums[right++]
    set(n1, get(n1) + 1)

    if (right - left >= k) {
      // 拿到第 x 小，更新答案
      const target = getMin(x)
      res[left] = target < 0 ? target : 0

      const n2 = nums[left++]
      set(n2, get(n2) - 1)
    }
  }

  return res
};